import cv2

img = cv2.imread("../images/demo2.png")
print(img.shape, type(img))

# 1. 均值滤波
img_blur = cv2.blur(
    img,
    (3, 3)
    # 后面的参数 输出图像，锚点，填充方式，均使用默认值
)
print(img_blur.shape)

# 2. 方框滤波
# 默认情况下方框滤波 = 均值滤波，但是可以设置normalize=False,默认为True
img_box = cv2.boxFilter(img,
                        -1,
                        (3, 3),
                        normalize=False)

# 3. 高斯滤波
img_gaussian = cv2.GaussianBlur(img,
                                ksize=(13, 13),  # 核大小越大，模糊效果越明显。
                                sigmaX=13)  # 高斯核函数在 X 方向的标准偏差。这个参数控制着模糊的程度。标准偏差越大，模糊效果越强。

# 4. 中值滤波
img_median = cv2.medianBlur(img,
                            ksize=3  # 滤波器的大小（即邻域的大小），必须是一个大于 1 的奇数
                            )

# 5. 双边滤波
img_bilateral = cv2.bilateralFilter(img,
                                    d=5,  # 邻域直径，建议d≤ 15，否则计算较慢。
                                    sigmaColor=5,  # 颜色空间标准偏差，该参数控制着颜色相似性。
                                    # 较大的 sigmaColor 值意味着更宽的颜色范围将被视为相似，从而增强去噪效果，但也可能导致边缘模糊。
                                    sigmaSpace=5
                                    # 这个参数决定了滤波函数在空间（或位置）上的标准差。较大的 sigmaSpace 值意味着更远的像素将被纳入加权平均，从而增强平滑效果，但也可能导致边缘模糊。
                                    )

# 图像就是一个ndarray，虽然cv2没有提供子图布局函数，但是可以使用plt或np.hstack()实现
import numpy as np

img_stak = np.hstack((img, img_blur, img_box, img_gaussian, img_median, img_bilateral))
cv2.imshow("img_stak", img_stak)
cv2.waitKey(0)
